using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace FiltronASP.Models.DAO.Interfaces
{
    /// <summary>
    /// Interfejs dla operacji bazodanowych specyficznych dla tabeli <code>item_types</code>.
    /// </summary>
    public interface IMenuItemDAO : IGenericDAO<MenuItem, System.Nullable<int>>
    {
        /// <summary>
        /// Pobieranie listy obiektow na podstawie menu.
        /// </summary>
        /// <param name="menuId">menu</param>
        /// <returns>lista rekordow o zadanym menu</returns>
        IQueryable<MenuItem> FindByMenuId(int menuId);

        /// <summary>
        /// Pobieranie listy obiektow na podstawie menu i glebokosci.
        /// </summary>
        /// <param name="menuId">menu</param>
        /// <param name="depth">glebokosc</param>
        /// <returns>lista rekordow o zadanym menu</returns>
        IQueryable<MenuItem> FindByMenuIdAndDepth(int menuId, int depth);

        /// <summary>
        /// Pobieranie listy obiektow na podstawie rodzica.
        /// </summary>
        /// <param name="parentId">rodzic</param>
        /// <returns>lista rekordow o zadanym rodzicu</returns>
        IQueryable<MenuItem> FindByParentId(int parentId);

        /// <summary>
        /// Pobieranie listy obiektow na podstawie strony.
        /// </summary>
        /// <param name="pageId">strona</param>
        /// <returns>lista rekordow o zadanym rodzicu</returns>
        IQueryable<MenuItem> FindByPageId(int pageId);

        /// <summary>
        /// Pobieranie listy obiektow na podstawie języka.
        /// </summary>
        /// <param name="languageId">język</param>
        /// <returns>lista rekordow o zadanym języku</returns>
        IQueryable<MenuItem> FindByLanguageId(int languageId);

        /// <summary>
        /// Pobieranie listy obiektow na podstawie języka, nazwy menu i informacji o publikacji.
        /// </summary>
        /// <param name="languageId">język</param>
        /// <param name="menuName">nazwa menu</param>
        /// <param name="itemPublished">opublikowana</param>
        /// <returns>lista rekordow o zadanym języku, nazwie menu i informacji o publikacji</returns>
        IQueryable<MenuItem> FindByLanguageIdAndMenuNameAndItemPublished(int languageId, String MenuName, bool itemPublished);

        /// <summary>
        /// Pobieranie listy obiektow na podstawie języka, nazwy menu, linku i informacji o publikacji.
        /// </summary>
        /// <param name="languageId">język</param>
        /// <param name="menuName">nazwa menu</param>
        /// <param name="itemLink">link</param>
        /// <param name="itemPublished">opublikowana</param>
        /// <returns>lista rekordow o zadanym języku, nazwie menu i informacji o publikacji</returns>
        IQueryable<MenuItem> FindByLanguageIdAndMenuNameAndItemLinkAndItemPublished(int languageId, String MenuName,String itemLink, bool itemPublished);

        /// <summary>
        /// Pobieranie listy obiektow na podstawie języka, nazwy menu, linku i aliasu.
        /// </summary>
        /// <param name="languageId">język</param>
        /// <param name="menuName">nazwa menu</param>
        /// <param name="itemLink">link</param>
        /// <param name="itemAlias">alias</param>
        /// <returns>lista rekordow o zadanym języku, nazwie menu i informacji o publikacji</returns>
        IQueryable<MenuItem> FindByLanguageIdAndMenuNameAndItemLinkAndItemPublished(int languageId, String MenuName, String itemLink, String itemAlias);

        /// <summary>
        /// Pobieranie listy obiektow na podstawie menu, o item ordering> od zadanego.
        /// </summary>
        /// <param name="menuId">menu</param>
        /// <param name="parentMenuItemId">nadrzedna pozycja menu (nullable)</param>
        /// <param name="itemOrdering">porzadek</param>
        /// <returns>lista rekordow o zadanym menu, pozycji nadrzednej i porzadku</returns>
        IQueryable<MenuItem> FindByMenuIdAndParentItemIdAndItemOrderingHigher(int menuId, int? parentMenuItemId, int itemOrdering);

        /// <summary>
        /// Pobieranie listy obiektow na podstawie menu, o item ordering< od zadanego.
        /// </summary>
        /// <param name="menuId">menu</param>
        /// <param name="parentMenuItemId">nadrzedna pozycja menu (nullable)</param>
        /// <param name="itemOrdering">porzadek</param>
        /// <returns>lista rekordow o zadanym menu, pozycji nadrzednej i porzadku</returns>
        IQueryable<MenuItem> FindByMenuIdAndParentItemIdAndItemOrderingLower(int menuId, int? parentMenuItemId, int itemOrdering);

        /// <summary>
        /// Pobieranie obiektu na podstawie menu i o item ordering> od zadanego.
        /// </summary>
        /// <param name="menuId">menu</param>
        /// <param name="parentMenuItemId">nadrzedna pozycja menu (nullable)</param>
        /// <param name="itemOrdering">porzadek</param>
        /// <returns>lista rekordow o zadanym menu, pozycji nadrzednej i porzadku</returns>
        MenuItem FindNeighbourByMenuIdAndParentItemIdAndItemOrderingHigher(int menuId, int? parentMenuItemId, int itemOrdering);

        /// <summary>
        /// Pobieranie obiektu na podstawie menu i o item ordering< od zadanego.
        /// </summary>
        /// <param name="menuId">menu</param>
        /// <param name="parentMenuItemId">nadrzedna pozycja menu (nullable)</param>
        /// <param name="itemOrdering">porzadek</param>
        /// <returns>lista rekordow o zadanym menu, pozycji nadrzednej i porzadku</returns>
        MenuItem FindNeighbourByMenuIdAndParentItemIdAndItemOrderingLower(int menuId, int? parentMenuItemId, int itemOrdering);

        /// <summary>
        /// Metoda do zamiany porzadku pozycji menu.
        /// </summary>
        /// <param name="firstMenuItemId">pierwsza pozycja menu</param>
        /// <param name="secondMenuItemId">druga pozycja menu</param>
        /// <returns>true w przypadku powodzenia, false wpp</returns>
        bool SwitchItemOrder(int firstMenuItemId, int secondMenuItemId);

        /// <summary>
        /// Metoda do zamiany porzadku pozycji menu, do góry.
        /// </summary>
        /// <param name="menuItems">pozycje menu nad wybrana</param>
        /// <param name="secondMenuItemId">pozycja menu</param>
        /// <returns>true w przypadku powodzenia, false wpp</returns>
        bool SwitchItemsOrder(IQueryable<MenuItem> menuItems, int menuItemToUpId);

        /// <summary>
        /// Pobieranie maksymalnego numeru porządkowego elementu dla danego menu.
        /// </summary>
        /// <param name="menuId">menu</param>
        /// <returns>maksymalny numer porządkowy elementu dla danego menu.</returns>
        int SelectMaxItemOrdering(int menuId);

        /// <summary>
        /// Zliczanie elementów dla danego aliasu, linku i menu.
        /// </summary>
        /// <param name="itemAlias">alias</param>
        /// <param name="itemLink">link</param>
        /// <param name="menuId">menu</param>
        /// <returns>Liczba elementów o zadanym aliasie, linku i menu</returns>
        int SelectCountItems(String itemLink, String itemAlias, int menuId);

        /// <summary>
        /// Pobieranie najwyższego id dla elementu menu.
        /// </summary>
        /// <returns>najwyższe id dla elementu menu</returns>
        int? SelectMaxMenuItemId();

        /// <summary>
        /// Metoda zwracajaca element dla danego aliasu, linku, menu z wylaczeniem wskazanego id.
        /// </summary>
        /// <param name="itemAlias">alias</param>
        /// <param name="itemLink">link</param>
        /// <param name="menuId">menu</param>
        /// <param name="itemIdToExclude">id wylaczone z wyszukiwania</param>
        /// <returns>element dla danego aliasu, linku, menu z wylaczeniem wskazanego id</returns>
        MenuItem FindByAliasLinkMenuIdAndNotItemId(string itemLink, string itemAlias,
            int menuId, int itemIdToExclude);
/*
        /// <summary>
        /// Metoda zwracajaca element dla danego jezyka, aliasu, linku i menu.
        /// </summary>
        /// <param name="languageId">jezyk</param>
        /// <param name="itemAlias">alias</param>
        /// <param name="itemLink">link</param>
        /// <param name="menuId">menu</param>
        /// <returns>element dla danego aliasu, linku, menu z wylaczeniem wskazanego id</returns>
        MenuItem FindByAliasLinkMenuIdAndNotItemId(int languageId, string itemLink, string itemAlias,
            int menuId);
*/
        /// <summary>
        /// Wstawianie listy obiektów na podstawie jezyka.
        /// </summary>
        /// <param name="defaultLanguageId">domyslny jezyk</param>
        /// <param name="newLanguageId">nowy jezyk</param>
        /// <returns>true jesli sie udalo, false wpp</returns>
        bool InsertForNewLanguage(int defaultLanguageId, int newLanguageId);

        /// <summary>
        /// Usuwanie obiektow po jezyku.
        /// </summary>
        /// <param name="languageId">jezyk</param>
        /// <returns>true dla sukcesu, false w przeciwnym razie</returns>
        bool DeleteByLanguage(int languageId);

        /// <summary>
        /// Aktualizacja linkow.
        /// </summary>
        /// <param name="defaultLanguageId">domyslny jezyk</param>
        /// <param name="newLanguageId">nowy jezyk</param>
        /// <returns>true jesli sie udalo, false wpp</returns>
        bool UpdateLinksForNewLanguage(int newLanguageId);

    }
}
